// 导入更新商品数据接口
import { getNewCartGoods, reqMergeLocalCart, reqFindCartList, reqInsertCart, reqDeleteCart, reqUpdateCartSku, reqCheckAllCart } from '@/api/cart'
// 购物车状态
export default {
  namespaced: true,
  state: () => {
    return {
      list: []
    }
  },
  mutations: {
    // 设置整个列表
    setList (state, list) {
      state.list = list
    },
    // 全选功能下面的小复选框
    checkEffectAll (state, selected) {
      state.list.forEach(item => {
        if (item.isEffective) {
          item.selected = selected
        }
      })
    },
    // 更新购物车列表商品数据
    // 更新商品数据
    // 更新购物车商品信息
    updateCart (state, goods) {
      // console.log(goods)
      // //console.log('待更新的信息检查', goods)
      const goodsObj = state.list.find(item => item.skuId === goods.skuId)
      // goodsObj.stock = goods.stock
      // goodsObj.nowPrice = goods.nowPrice
      // goodsObj.isEffective = goods.isEffective
      for (const key in goods) {
        // 更新不为 null 的字段
        if (goods[key] !== null) {
          goodsObj[key] = goods[key]
        }
      }
    },
    // 删除订单数据的实现
    deleteCart (state, skuId) {
      state.list = state.list.filter(item => item.skuId !== skuId)
    },
    // 添加购物车逻辑
    insertCart (state, goods) {
      // 添加购物车逻辑
      const index = state.list.findIndex(item => item.skuId === goods.skuId)
      // 情况 1 没有添加过的商品数据
      if (index === -1) {
        // 把goods的数据列表追加到原有的数据列表
        state.list = [goods, ...state.list]
      } else {
        // 情况 2 已经添加了商品。再添加应该把数量相加起来
        // 把选中规格的商品的count数量和后台数据中的数据数量相加
        state.list[index].count += goods.count
      }
    }
  },
  // 有两种情况 已登录 和 未登录的情况
  actions: {
    // 合并购物车
    async asyncMergeLocalCart (store) {
      const cartList = store.state.list.map((item) => {
        return {
          skuId: item.skuId,
          selected: item.selected,
          count: item.count
        }
      })
      await reqMergeLocalCart(cartList).then(res => {
        // 合并成功后，从后端获取最新购物车列表替换本地，业务代码在 asyncUpdateCart 内
        // console.log('合并数据', res)
      })
    },
    // 全选功能调用
    asyncCheckEffectAll (store, selected) {
      return new Promise((resolve, reject) => {
        if (store.rootState.user.profile.token) {
          // console.log('已经登录')
          // 有效商品skuid集合
          const ids = store.getters.effectiveList.map(v => v.skuId)
          // console.log(1111111, ids)
          reqCheckAllCart({ selected, ids }).then((res) => {
            // 更新页面数据
            store.dispatch('asyncUpdateCart')
          })
          resolve()
        } else {
          // //console.log('未登录')
          // 调用之前的更新购物车的封装的接口数据
          store.commit('checkEffectAll', selected)
          // 调用 resolve() 后，会运行 Promise 对象的 then() 内部代码
          resolve()
        }
      })
    },
    // 更新购物车列表的单个商品数据
    asyncInertSingle (store, goods) {
      // //console.log(store)
      // //console.log(store.rootState.user.profile.token)
      return new Promise((resolve, reject) => {
        if (store.rootState.user.profile.token) {
          // console.log('已经登录')
          reqUpdateCartSku(goods).then(res => {
            // console.log('数量添加', res)
            // store.dispatch('asyncUpdateCart')
            resolve()
          })
        } else {
          // //console.log('未登录')
          // 调用之前的更新购物车的封装的接口数据
          store.commit('updateCart', goods)
          // 调用 resolve() 后，会运行 Promise 对象的 then() 内部代码
          resolve()
        }
      })
    },
    // 更新商品数据
    asyncUpdateCart (store) {
      // 发送请求，更新购物车中所有的商品信息
      return new Promise((resolve, reject) => {
        if (store.rootState.user.profile.token) {
          // 登录了
          // console.log('调用接口')
          // 合并数据
          reqFindCartList().then(({ result }) => {
            store.commit('setList', result)
            resolve()
          })
        } else {
          const arr = []
          // 没有登录，需要发送请求进行商品信息更新
          // store.commit('updateCart', skuId)
          store.state.list.forEach(item => {
            // 把从接口获取到的数据追加到数组中
            arr.push(getNewCartGoods(item.skuId))
          })
          // 在购物车中存在的商品的promise请求
          // console.log(1111, arr)
          // 调用promise.all的语法获取所有的商品数据
          Promise.all(arr).then((res) => {
            // 加入购物车的商品
            // console.log(22222222, res)
            res.forEach((item, index) => {
              // console.log(111, item, 333, index)
              store.commit('updateCart', {
                skuId: store.state.list[index].skuId,
                // result 是上面接口返回来的数据
                ...item.result
              })
            })
            resolve()
          })
        }
      })
    },
    // 删除数据
    asyncDeleteCart (store, skuId) {
      // //console.log(store)
      // //console.log(store.rootState.user.profile.token)
      return new Promise((resolve, reject) => {
        if (store.rootState.user.profile.token) {
          // console.log('已经登录')
          reqDeleteCart([skuId]).then(res => {
            // 重新从服务器获取新的数据
            store.dispatch('asyncUpdateCart')
          })
        } else {
          // //console.log('未登录')
          // 未登录的删除
          store.commit('deleteCart', skuId)
          // 调用 resolve() 后，会运行 Promise 对象的 then() 内部代码
          resolve()
        }
      })
    },
    // 添加购物车
    asyncInertCart (store, goods) {
      // //console.log(store)
      // //console.log(store.rootState.user.profile.token)
      return new Promise((resolve, reject) => {
        if (store.rootState.user.profile.token) {
          // console.log('已经登录')
          const { skuId, count } = goods
          // 登录后连接接口请求数据
          reqInsertCart({ skuId, count }).then((res) => {
            // console.log(170, result)
            store.dispatch('asyncUpdateCart', res)
            resolve()
          })
        } else {
          // //console.log('未登录')
          store.commit('insertCart', goods)
          // 调用 resolve() 后，会运行 Promise 对象的 then() 内部代码
          resolve()
        }
      })
    }
  },
  getters: {
    // 已选择的列表
    selectedList (state, getters) {
      // 过滤无效列表
      return getters.effectiveList.filter(item => item.isEffective)
    },
    // 已选择的商品总数
    selectedAllCounts (state, getters) {
      return getters.effectiveList.reduce((total, item) => total + item.count, 0)
    },
    // 已选择的列表总价
    selectedAllPrice (state, getters) {
      return getters.effectiveList.reduce((total, item) => total + item.count * item.price, 0).toFixed(2)
    },
    // 计算属性：是否全部选中
    isAllEffectSelected (state, getters) {
      // 把经过对象方法的对象结果返回
      return getters.effectiveList.every(item => item.selected) && getters.effectiveList.length !== 0
    },
    // 计算有效商品列表 isEffective = true  filter
    effectiveList (state) {
      return state.list.filter(item => item.stock > 0 && item.isEffective === true)
    },
    // 有效商品总数量 把effctiveList中的每一项的count叠加起来
    effectiveTotal (state, getters) {
      // let total = 0
      // getters.effectiveList.forEach(item => { total += item.count })
      // return total
      return getters.effectiveList.reduce((total, item) => { return total + item.count }, 0)
    },
    // 总钱数  = 所有单项的钱数累加  单项的钱数 = 数量 * 单价
    effectiveTotalPrice (state, getters) {
      return getters.effectiveList.reduce((total, item) => { return total + item.count * item.price }, 0).toFixed(2)
    }
  }
}
